package com.iwuke.dance.activity;

import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.iwuke.dance.R;
import com.iwuke.dance.gadget_view.TitleBarView;
import com.iwuke.dance.http_request.NetManger;
import com.iwuke.dance.util.Util;
import com.iwuke.dance.util.merchants_connect.NetworkEvent;

import java.util.ArrayList;
import java.util.List;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import de.greenrobot.event.EventBus;

/**
 * @author: 魏从响
 * @date: 2025/9/12
 */
public abstract class BaseActivity extends AppCompatActivity {

    //3. 实时监听网络变化（推荐方式）
    //对于需要实时响应网络状态变化的应用，建议使用 NetworkCallback 替代轮询：
    private ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
        @Override
        public void onAvailable(Network network) {
            // 网络可用时的回调
//            runOnUiThread(() -> updateUI("NETWORK_AVAILABLE"));
            EventBus.getDefault().post(new NetworkEvent(1));
        }

        @Override
        public void onLost(Network network) {
            // 网络丢失时的回调
//            runOnUiThread(() -> updateUI("NETWORK_LOST"));
            EventBus.getDefault().post(new NetworkEvent(-1));
        }

        @Override
        public void onCapabilitiesChanged(Network network, NetworkCapabilities capabilities) {
            // 网络能力发生变化时的回调
            if (capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
//                runOnUiThread(() -> updateUI("INTERNET_ACCESS_AVAILABLE"));
            }
        }
    };

    private Bundle instanceState;
    private long startTime;
    private View mView;
    public boolean isNetwork = true;
    private ConnectivityManager cm;
    private Fragment currentFragment; // 记录当前显示的Fragment
    public List<Fragment> fragmentList = new ArrayList<>();// Fragment列表

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instanceState = savedInstanceState;
        EdgeToEdge.enable(this);

        Util.setAndroidNativeLightStatusBar(this, true);//字体黑色
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置
        if (mView == null) {
            mView = View.inflate(this, getView(), null);
        }
        setContentView(mView);

        //注册
        EventBus.getDefault().register(this);
        init(mView);

        initData();

        // 注册监听器
        cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        cm.registerDefaultNetworkCallback(networkCallback);

    }

    public Bundle getBundle(){

        return instanceState;
    }

    protected abstract int getView();

    protected abstract void init(View mView);

    protected abstract void initData();

    public static void setConnect(Context context, NetworkEvent networkEvent, TitleBarView title_bar){
        if (networkEvent.getNetworkEvent()==-1){
            if (title_bar==null){
                Toast.makeText(context,context.getString(R.string.connect),Toast.LENGTH_SHORT).show();
            }else {
                title_bar.setConnectVisibility(true);
            }
        }else {
            if (title_bar!=null){
                title_bar.setConnectVisibility(false);
            }
        }
    }

    public void setLinearLayoutManager(Context context, RecyclerView recyclerView) {
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
        linearLayoutManager.setOrientation(RecyclerView.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);
    }

    /**
     * @desc 选择当前Fragment
     * @author 魏从响
     * @time 2025/10/23 13:55
     */
    public void switchFragment(Fragment targetFragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        // 开启单个事务，设置重新排序允许以优化性能
        // 开启一个事务  一个事务对应一个commit()，否则报错“IllegalStateException”
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.setReorderingAllowed(true);
        // 确保 setCustomAnimations() 方法在 add()、replace()、hide() 或 show() 等操作之前调用
        transaction.setCustomAnimations(
//                android.R.anim.slide_in_left,   // enter: 新Fragment进入动画
//                android.R.anim.slide_out_right, // exit: 旧Fragment退出动画
//                android.R.anim.slide_in_left,   // popEnter: 从返回栈弹出时，上一个Fragment进入动画
//                android.R.anim.slide_out_right  // popExit: 从返回栈弹出时，当前Fragment退出动画
                android.R.anim.fade_in,  // 进入动画
                android.R.anim.fade_out, // 退出动画
                android.R.anim.fade_in,  // 进入动画
                android.R.anim.fade_out  // 退出动画
        );
        // 隐藏所有其他Fragment
        for (Fragment f : fragmentList) {
            if (!f.equals(targetFragment) && targetFragment.isAdded()) {
                transaction.hide(f);
            }
        }
        // 显示或添加目标Fragment
        if (targetFragment.isAdded()) {// Fragment已存在，直接显示
            transaction.show(targetFragment);
        } else {// 首次添加Fragment
            transaction.add(R.id.frame_layout, targetFragment, targetFragment.getClass().getName());
        }
        // 更新当前Fragment引用
        currentFragment = targetFragment;
        // transaction.addToBackStack(null); // 如需返回堆栈支持可取消注释
        transaction.commit();// 提交事务（可选择是否添加到返回堆栈）
    }

    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        super.onSaveInstanceState(outState);
        if (currentFragment != null) {
            // 保存当前Fragment的tag
            outState.putString("CURRENT_FRAGMENT", currentFragment.getClass().getName());
        }
    }


    private View loadingView;
    private ViewGroup root;

    /**
     * @description 显示加载对话框
     * @param 
     * @return 
     * @author 魏从响
     * @time 2025/9/25 17:35
     */
    public void showLoadingDialog() {
        root = ((ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content));
        if (root.getChildCount() > 0&&loadingView!=null) {
            root.removeView(loadingView);
        }
        loadingView = LayoutInflater.from(this).inflate(R.layout.loading_alert, null);
        ImageView img_loading = loadingView.findViewById(R.id.img_loading);
        Animation rotateAnim = AnimationUtils.loadAnimation(this, R.anim.rotate_animation);
        img_loading.startAnimation(rotateAnim);
//        img_loading.clearAnimation();//清除

//        LottieAnimationView animationView = loadingView.findViewById(R.id.animationView);
//        animationView.setAnimation("loading_1.json"); // 动态加载
//        animationView.playAnimation(); // 开始动画
//        animationView.pauseAnimation(); // 暂停动画
//        animationView.setSpeed(1.5f); // 调整播放速度[4](@ref)[6](@ref)
        //1、性能优化
        //使用lottie_cacheStrategy="strong"缓存动画，减少重复解析开销。
        //对复杂动画启用硬件加速：android:hardwareAccelerated="true"。

        //2、动态颜色修改
        //通过LottieProperty.COLOR动态修改动画中的颜色：
//        ValueCallback<ColorFilter> callback = new ValueCallback<ColorFilter>() {
//            @Override
//            public ColorFilter getValue(LottieFrameInfo<ColorFilter> frameInfo) {
//                return new PorterDuffColorFilter(Color.RED, PorterDuff.Mode.SRC_ATOP);
//            }
//        };
//        animationView.addValueCallback(new KeyPath("**"), LottieProperty.COLOR_FILTER, callback);

        //3、进度控制
//         animationView.setProgress(0.5f); // 跳转到50%进度

        //四、设计工具推荐
        //LottieFiles在线编辑器
        //可直接编辑JSON动画并预览效果，支持调整速度、颜色等参数。
        //Figma插件
        //使用LottieFiles插件在Figma中直接导入和预览Lottie动画，无需切换设计工具。

        root.addView(loadingView);
    }

    /**
     * @description 解除加载对话框
     * @param 
     * @return 
     * @author 魏从响
     * @time 2025/9/25 17:35
     */
    public void dismissLoadingDialog() {
        if (null != root && root.getChildCount() > 0) {
            root.removeView(loadingView);
        }
    }

    /**
     * @description 背面移除
     * @param
     * @return
     * @author 魏从响
     * @time 2025/9/25 17:36
     */
    public void onBackRemove() {
        if (null != root && root.getChildCount() > 0) {
            root.removeView(loadingView);
        }
    }

    private View item_popup;
    private PopupWindow popupWindow;
    public void popupWindow(Context context){
        //PopupWindow布局
        item_popup = View.inflate(context, R.layout.loading_alert, null);

        popupWindow = new PopupWindow(item_popup, ActionBar
                .LayoutParams.MATCH_PARENT,ActionBar.LayoutParams
                .WRAP_CONTENT,true);
        popupWindow.setTouchable(true);

        popupWindow.setOutsideTouchable(true);
        //新方法：使用透明的 ColorDrawable   new ColorDrawable(Color.TRANSPARENT)和new BitmapDrawable()一样
        popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        // 设置白色背景
        //popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
        //创建带圆角的背景 首先，在 res/drawable 目录下创建一个 XML 文件（如 popup_background.xml）：
        //popupWindow.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.popup_background));
        //使用 NinePatch 图片作为背景 如果你的设计需要更复杂的背景效果，可以使用 .9.png 图片：
        //popupWindow.setBackgroundDrawable(ContextCompat.getDrawable(context, R.drawable.your_nine_patch_background));

        popupWindow.showAtLocation(item_popup, Gravity.BOTTOM,0,0);

        //popupWindow.dismiss();
    }

    public void popupWindowDismiss() {
        if (null != popupWindow) {
            popupWindow.dismiss();
        }
    }



    @Override
    protected void onResume() {
        super.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause( );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        // 不要忘记在适当的时候取消注册
        if (cm!=null) {
            cm.unregisterNetworkCallback(networkCallback);
        }
        if(getClass().getName()!=null){
            NetManger.getRequest().cancel(getClass().getName());
        }
    }
}
